/******************************************************************************* * Copyright (c) 2009, 2017 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation ******************************************************************************/ package org.eclipse.jface.tests.fieldassist; import org.eclipse.jface.bindings.keys.KeyStroke; import org.eclipse.jface.fieldassist.ContentProposalAdapter; import org.eclipse.jface.fieldassist.ControlDecoration; import org.eclipse.jface.fieldassist.FieldDecorationRegistry; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Shell; /** * This class contains test cases appropriate for generic field assist * tests in various controls. Tests that are not appropriate for the * pre-configured content assist command adapter should go here. * * @since 3.6 * */ public abstract class FieldAssistTestCase extends AbstractFieldAssistTestCase { static final String SAMPLE_CONTENT = "s"; static final char ACTIVATE_CHAR = 'i'; static final char EXTRA_CHAR = 'b'; public void testAutoactivateNoDelay() { AbstractFieldAssistWindow window = getFieldAssistWindow(); window.setPropagateKeys(false); window.setAutoActivationDelay(0); window.setAutoActivationCharacters(new char [] {ACTIVATE_CHAR}); window.open(); setControlContent(SAMPLE_CONTENT); sendKeyDownToControl(ACTIVATE_CHAR); ensurePopupIsUp(); assertTwoShellsUp(); } public void testAutoactivateWithDelay() { AbstractFieldAssistWindow window = getFieldAssistWindow(); window.setPropagateKeys(false); window.setAutoActivationDelay(600); window.setAutoActivationCharacters(new char [] {ACTIVATE_CHAR}); window.open(); setControlContent(SAMPLE_CONTENT); sendKeyDownToControl(ACTIVATE_CHAR); ensurePopupIsUp(); assertTwoShellsUp(); } public void testExplicitActivate() { AbstractFieldAssistWindow window = getFieldAssistWindow(); window.setPropagateKeys(false); KeyStroke stroke = KeyStroke.getInstance(SWT.F4); window.setKeyStroke(stroke); window.open(); sendKeyDownToControl(stroke); assertTwoShellsUp(); } public void testPopupDeactivates() { AbstractFieldAssistWindow window = getFieldAssistWindow(); window.setPropagateKeys(false); window.setAutoActivationDelay(0); window.setAutoActivationCharacters(new char [] {ACTIVATE_CHAR}); window.open(); setControlContent(SAMPLE_CONTENT); sendKeyDownToControl(ACTIVATE_CHAR); ensurePopupIsUp(); assertTwoShellsUp(); sendFocusElsewhere(); spinEventLoop(); assertOneShellUp(); } public void testPropagateKeysOff() { AbstractFieldAssistWindow window = getFieldAssistWindow(); window.setPropagateKeys(false); window.setAutoActivationCharacters(new char [] {ACTIVATE_CHAR}); window.open(); setControlContent(SAMPLE_CONTENT); sendKeyDownToControl(ACTIVATE_CHAR); ensurePopupIsUp(); assertTwoShellsUp(); sendKeyDownToControl(EXTRA_CHAR); assertEquals("1.0", SAMPLE_CONTENT + new String(new char [] {ACTIVATE_CHAR}), getControlContent()); } public void testPropagateKeysOn() { AbstractFieldAssistWindow window = getFieldAssistWindow(); window.setPropagateKeys(true); window.setAutoActivationCharacters(new char [] {ACTIVATE_CHAR}); window.open(); setControlContent(SAMPLE_CONTENT); sendKeyDownToControl(ACTIVATE_CHAR); ensurePopupIsUp(); assertTwoShellsUp(); sendKeyDownToControl(EXTRA_CHAR); assertEquals("1.0", SAMPLE_CONTENT + new String(new char [] {ACTIVATE_CHAR, EXTRA_CHAR}), getControlContent()); } public void testBug262022() { AbstractFieldAssistWindow window = getFieldAssistWindow(); window.setPropagateKeys(false); window.setAutoActivationCharacters(new char [] {ACTIVATE_CHAR}); window.open(); setControlContent(SAMPLE_CONTENT); sendKeyDownToControl(ACTIVATE_CHAR); ensurePopupIsUp(); assertTwoShellsUp(); // cursor key down will cause an asyncExec that recomputes proposals. Before we process the event, let's // kill the window in an async. That should cause the event to be processed and then the window killed before // the subsequent async. Event event = new Event(); event.type = SWT.KeyDown; event.keyCode = SWT.ARROW_LEFT; window.getDisplay().post(event); window.getDisplay().asyncExec(() -> closeFieldAssistWindow()); spinEventLoop(); } public void testBug279953() { AbstractFieldAssistWindow window = getFieldAssistWindow(); window.setPropagateKeys(false); window.setAutoActivationCharacters(new char [] {ACTIVATE_CHAR}); window.open(); assertOneShellUp(); ControlDecoration decoration = new ControlDecoration(getFieldAssistWindow().getFieldAssistControl(), SWT.RIGHT); decoration.setImage(FieldDecorationRegistry.getDefault() .getFieldDecoration(FieldDecorationRegistry.DEC_INFORMATION).getImage()); decoration.setDescriptionText(""); decoration.showHoverText(""); assertOneShellUp(); } public void testDecorationIsVisible() { AbstractFieldAssistWindow window = getFieldAssistWindow(); window.setPropagateKeys(false); window.setAutoActivationCharacters(new char [] {ACTIVATE_CHAR}); window.open(); assertOneShellUp(); ControlDecoration decoration = new ControlDecoration(getFieldAssistWindow().getFieldAssistControl(), SWT.RIGHT); decoration.setImage(FieldDecorationRegistry.getDefault() .getFieldDecoration(FieldDecorationRegistry.DEC_INFORMATION).getImage()); decoration.setDescriptionText("foo"); spinEventLoop(); assertTrue("1.0", decoration.isVisible()); decoration.hide(); assertFalse("1.1", decoration.isVisible()); decoration.setShowOnlyOnFocus(true); sendFocusElsewhere(); sendFocusInToControl(); spinEventLoop(); assertFalse("1.2", decoration.isVisible()); decoration.show(); assertTrue("1.3", decoration.isVisible()); sendFocusElsewhere(); spinEventLoop(); assertFalse("1.4", decoration.isVisible()); decoration.setShowOnlyOnFocus(false); assertTrue("1.5", decoration.isVisible()); window.getFieldAssistControl().setVisible(false); assertFalse("1.6", decoration.isVisible()); decoration.hide(); window.getFieldAssistControl().setVisible(true); assertFalse("1.7", decoration.isVisible()); decoration.show(); assertTrue("1.8", decoration.isVisible()); } public void testPopupFocus() { AbstractFieldAssistWindow window = getFieldAssistWindow(); window.setPropagateKeys(false); KeyStroke stroke = KeyStroke.getInstance(SWT.F4); window.setKeyStroke(stroke); window.open(); sendKeyDownToControl(stroke); assertTwoShellsUp(); // Send focus to the control (not the popup) window.getFieldAssistControl().setFocus(); spinEventLoop(); assertFalse("1.0", window.getContentProposalAdapter().hasProposalPopupFocus()); window.getContentProposalAdapter().setProposalPopupFocus(); spinEventLoop(); assertTrue("1.1", window.getContentProposalAdapter().hasProposalPopupFocus()); // Setting focus to another shell deactivates the popup sendFocusElsewhere(); spinEventLoop(); assertOneShellUp(); assertFalse("1.2", window.getContentProposalAdapter().hasProposalPopupFocus()); } public void testPopupIsOpen() { AbstractFieldAssistWindow window = getFieldAssistWindow(); window.setPropagateKeys(false); KeyStroke stroke = KeyStroke.getInstance(SWT.F4); window.setKeyStroke(stroke); window.open(); assertFalse("1.0", window.getContentProposalAdapter().isProposalPopupOpen()); sendKeyDownToControl(stroke); assertTwoShellsUp(); assertTrue("1.1", window.getContentProposalAdapter().isProposalPopupOpen()); // Setting focus to another shell deactivates the popup sendFocusElsewhere(); spinEventLoop(); assertOneShellUp(); assertFalse("1.2", window.getContentProposalAdapter().isProposalPopupOpen()); } /** * Replace mode is easier to test because we can check that the bounds * does not intersect the control. In insertion mode, the popup is * supposed to overlap the control (using the insertion cursor to track * position). */ public void testBug256651ReplaceMode() { AbstractFieldAssistWindow window = getFieldAssistWindow(); window.setPropagateKeys(false); window.setAutoActivationCharacters(new char [] {ACTIVATE_CHAR}); window.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE); window.open(); Display display = getDisplay(); Rectangle displayBounds = display.getBounds(); window.getShell().setLocation(0, displayBounds.height - window.getShell().getBounds().height); assertOneShellUp(); setControlContent(SAMPLE_CONTENT); sendKeyDownToControl(ACTIVATE_CHAR); ensurePopupIsUp(); assertTwoShellsUp(); sendFocusToPopup(); Shell popupShell = display.getActiveShell(); Rectangle popupBounds = popupShell.getBounds(); Rectangle controlBounds = getFieldAssistWindow().getFieldAssistControl().getBounds(); controlBounds = getDisplay().map(getFieldAssistWindow().getFieldAssistControl().getParent(), null, controlBounds); assertFalse("Popup is blocking the control", popupBounds.intersects(controlBounds)); } /** * Replace mode is easier to test because we can check that the bounds * does not intersect the control. In insertion mode, the popup is * supposed to overlap the control (using the insertion cursor to track * position). */ public void testDefaultPopupPositioningReplaceMode() { AbstractFieldAssistWindow window = getFieldAssistWindow(); window.setPropagateKeys(false); window.setAutoActivationCharacters(new char [] {ACTIVATE_CHAR}); window.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE); window.open(); Display display = getDisplay(); window.getShell().setLocation(0, 0); assertOneShellUp(); setControlContent(SAMPLE_CONTENT); sendKeyDownToControl(ACTIVATE_CHAR); ensurePopupIsUp(); assertTwoShellsUp(); sendFocusToPopup(); Shell popupShell = display.getActiveShell(); Rectangle popupBounds = popupShell.getBounds(); Rectangle controlBounds = getFieldAssistWindow().getFieldAssistControl().getBounds(); controlBounds = getDisplay().map(getFieldAssistWindow().getFieldAssistControl().getParent(), null, controlBounds); assertFalse("Popup is blocking the control", popupBounds.intersects(controlBounds)); } }